package iface.aplicativo.negocio.aps;

import iface.aplicativo.excecao.MensagemException;
import iface.aplicativo.integracao.dao.EntradaVeiculoDAO;
import iface.aplicativo.integracao.dao.PessoaDAO;
import iface.aplicativo.integracao.dao.VeiculoDAO;
import iface.aplicativo.negocio.entidade.EntradaVeiculo;
import iface.aplicativo.negocio.entidade.Pessoa;
import iface.aplicativo.negocio.entidade.Veiculo;
import iface.aplicativo.negocio.enumerador.IndSimNao;
import iface.aplicativo.negocio.enumerador.SituacaoDocumentoEnum;
import iface.aplicativo.util.Constantes;
import iface.aplicativo.util.ResourceMessageFactory;
import iface.aplicativo.util.UtilResource;
import iface.arquitetura.comum.string.UtilString;
import iface.arquitetura.utilitario.ResourceMessageAnnotation;
import iface.arquitetura.utilitario.UtilCPF;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.annotation.Resource;
import javax.faces.model.SelectItem;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional(readOnly = true, rollbackFor = { Exception.class })
public class CadastrarEntradaAPS {

	@ResourceMessageAnnotation(propertiesFile = { Constantes.RECURSO_MENSAGENS })
	private UtilResource resource = ResourceMessageFactory.inicialize(this);

	@Resource
	VeiculoDAO veiculoDAO;
	@Resource
	EntradaVeiculoDAO entradaVeiculoDAO;
	@Resource
	PessoaDAO pessoaDAO;

	@Transactional(propagation = Propagation.REQUIRED)
	public String cadastrarEntrada(EntradaVeiculo entidade) throws Exception {
		this.validarCamposCadastroEntrada(entidade);
		this.verificarPermissaoCadastro(entidade);

		if (entidade.getId() == null) {
			this.entradaVeiculoDAO.inserir(entidade);
			return this.resource.getMensagens("MSG01");
		} else {
			this.entradaVeiculoDAO.alterar(entidade);
			return this.resource.getMensagens("MSG02");
		}

	}

	public void validarCamposCadastroEntrada(EntradaVeiculo entidade)
			throws Exception {
		this.resource.clearMensagens();

		if (entidade != null) {
			if (entidade.getDtCompraVeiculo() == null) {
				this.resource.addMensagens("MSG05", "Data da compra");
			}
			if (entidade.getFornecedor() == null
					|| UtilString.isVazio(entidade.getFornecedor()
							.getNmPessoa())) {
				this.resource.addMensagens("MSG05", "Fornecedor");
			}
			if (entidade.getVeiculo() == null
					|| UtilString.isVazio(entidade.getVeiculo().getNrPlaca())) {
				this.resource.addMensagens("MSG05", "Placa");
			}
			if (entidade.getVlrCompraVeiculo() == null) {
				this.resource.addMensagens("MSG05", "Valor de compra");
			}
			if (entidade.getVlrVendaVeiculo() == null) {
				this.resource.addMensagens("MSG05", "Valor de venda");
			}
		}

		if (!this.resource.isMensagens()) {
			if (!UtilString.isVazio(entidade.getCpfIntermediario())) {
				UtilCPF utilCPF = new UtilCPF();
				String cpf = UtilCPF.removerFormatacao(entidade
						.getCpfIntermediario());
				if (!utilCPF.validarCPF(cpf)) {
					this.resource.addMensagens("MSG13");
				}
			}
		}

		if (this.resource.isMensagens()) {
			throw new MensagemException(this.resource.getMensagens());
		}
	}

	public void verificarPermissaoCadastro(EntradaVeiculo entidade)
			throws MensagemException, Exception {
		Collection<EntradaVeiculo> entradas = this.entradaVeiculoDAO
				.consultarEntradaPorVeiculo(entidade.getVeiculo());
		if (entradas != null && !entradas.isEmpty()) {
			EntradaVeiculo entrada = entradas.iterator().next();
			if (entrada.getVendaVeiculo() == null) {
				throw new MensagemException(
						this.resource.getMensagens("MSG022"));
			}
		}
	}

	@Transactional(propagation = Propagation.REQUIRED)
	public String excluirEntradaVeiculo(EntradaVeiculo entidade)
			throws Exception {
		try {
			this.entradaVeiculoDAO.remover(entidade);
		} catch (Exception ex) {
			throw new Exception(ex);
		}
		return this.resource.getMensagens("MSG03");
	}

	public Veiculo consultarVeiculoPorId(String nrPlaca) throws Exception {
		Veiculo entidade = null;
		try {
			entidade = this.veiculoDAO.obter(nrPlaca);
		} catch (Exception ex) {
			throw new Exception(ex);
		}
		return entidade;
	}

	public EntradaVeiculo consultarEntradaVeiculoPorId(Long id)
			throws Exception {
		EntradaVeiculo entidade = null;
		try {
			entidade = this.entradaVeiculoDAO.obter(id);
		} catch (Exception ex) {
			throw new Exception(ex);
		}
		return entidade;
	}

	public Collection<Veiculo> consultarVeiculosPorPlaca(final String nrPlaca) {
		return this.veiculoDAO.consultarVeiculosPorPlaca(nrPlaca);
	}

	public Collection<Pessoa> consultarFornecedoresPorNome(final String nome) {
		return this.pessoaDAO.consultarFornecedoresPorNome(nome);
	}

	public Collection<Pessoa> consultarDespachantesPorNome(final String nome) {
		return this.pessoaDAO.consultarDespachantesPorNome(nome);
	}

	public Collection<EntradaVeiculo> consultarTodosCadastroEntrada() {
		return this.entradaVeiculoDAO.consultar();
	}

	public List<SelectItem> consultarSimNao() {
		List<SelectItem> lista = new ArrayList<SelectItem>();
		lista.add(new SelectItem("", ":: Selecione ::"));
		lista.add(new SelectItem(IndSimNao.S, IndSimNao.S.getLabel()));
		lista.add(new SelectItem(IndSimNao.N, IndSimNao.N.getLabel()));

		return lista;
	}

	public List<SelectItem> consultarSituacaoDocumento() {
		List<SelectItem> lista = new ArrayList<SelectItem>();
		lista.add(new SelectItem("", ":: Selecione ::"));
		lista.add(new SelectItem(SituacaoDocumentoEnum.R,
				SituacaoDocumentoEnum.R.getLabel()));
		lista.add(new SelectItem(SituacaoDocumentoEnum.V,
				SituacaoDocumentoEnum.V.getLabel()));

		return lista;
	}

}
